package com.groupbuying.customerconsumer.mq;

import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.groupbuying.customerconsumer.constants.RedisConstants;
import com.groupbuying.customerconsumer.dao.CustomerUshopDao;
import com.groupbuying.customerconsumer.dao.CustomerWxinfoRelDao;
import com.groupbuying.customerconsumer.domain.CustomerUshopDO;
import com.groupbuying.customerconsumer.domain.CustomerWxinfoRelDO;
import com.groupbuying.customerconsumer.utils.RedisUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;

/**
 *  微信注册信息操作
 * @auther lisurilige
 * @date 2019/8/16
 */
@Component
public class CustomerWechat {

    Logger logger = LoggerFactory.getLogger(CustomerWechat.class);

    @Autowired
    private CustomerUshopDao customerUshopDao;

    @Autowired
    private CustomerWxinfoRelDao customerWxinfoRelDao;

    @Autowired
    private RedisUtils redisUtils;

    /**
     *  保存mq手机号授权微信注册信息
     * @param messageBody
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean saveObject(Map<String, Object> messageBody) {
        logger.info("微信手机号授权注册信息====msg={}", messageBody);

        //判断map是否有数据
        if (null == messageBody || messageBody.size() <= 0) {
            logger.error("微信手机号授权注册信息为空");
            return false;
        }

        CustomerUshopDO customer = JSON.toJavaObject((JSON) messageBody.get("customer"),CustomerUshopDO.class);
        CustomerWxinfoRelDO wxRel = JSON.toJavaObject((JSON) messageBody.get("wxRel"),CustomerWxinfoRelDO.class);
        logger.info("新增，微信手机号授权注册信息，用户表参数信息 customer:{}",customer);
        logger.info("新增，微信手机号授权注册信息，微信关联表参数信息 wxRel:{}",wxRel);

        //判断是否为空
        if (customer == null || wxRel == null) {
            logger.error("微信手机号授权注册信息不存在");
            return true;
        }

        //判断主键是否为空字符串
        if (StringUtils.isEmpty(customer.getCustomerId())){
            logger.error("消费者，微信注册信息保存 customerId 不能为空");
            return true;
        }

        //判断openid是否为空
        if (StringUtils.isEmpty(wxRel.getOpenId())){
            logger.error("customer消费者，微信注册信息保存 openId 不能为空");
            return true;
        }

        //没有redis信息-保存 有redis信息 返回true 为了防止重复提交
        String redisKey = RedisConstants.RDS_WX_OPENID+wxRel.getOpenId();
        if (redisUtils.isHasKey(redisKey)){
            logger.error("customer消费者，微信注册信息保存 openid 重复提交");
            return true;
        }
        boolean isTrue = redisUtils.setIfAbsent(redisKey,wxRel.getOpenId(),RedisConstants.RDS_WX_EXP);

        //redis  保存不成功  重新消费
        if (!isTrue){
            logger.error("customer消费者，微信注册信息保存 openid保存redis有误");
            return false;
        }
        //执行保存方法
        try {
            customerUshopDao.save(customer);
            customerWxinfoRelDao.save(wxRel);
        } catch (DuplicateKeyException d) {
            logger.info("提示信息：{}，customerId：{}","微信手机号授权注册信息，主键冲突,当前数据已经保存多次",customer.getCustomerId());
            return true;
        } catch (Exception e) {
            logger.info("customer：{}，wxRel：{}，错误提示：{}",customer,wxRel,"微信手机号授权注册信息，保存数据其他异常");
            return true;
        }

        return true;
    }

    /**
     *  更新mq微信注册信息
     * @param messageBody   mq消息体
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean updateObject(Map<String, Object> messageBody){
        //判断map是否有数据
        if (null  == messageBody || messageBody.size() <= 0) {
            logger.error("更新微信注册信息为空");
            return false;
        }

        CustomerUshopDO customer = JSON.toJavaObject((JSON) messageBody.get("customer"),CustomerUshopDO.class);
        logger.info("更新参数信息 customer:{}",customer);

        //判断是否为空
        if (customer == null) {
            logger.error("CustomerUshopDO 修改注册信息不存在");
            return false;
        }

        //判断主键是否为空字符串
        if (StringUtils.isEmpty(customer.getCustomerId())){
            logger.error("customerId 不能为空");
            return true;
        }

        //执行更新方法
        customerUshopDao.update(customer);

        return true;
    }

    /**
     *  保存mq微信注册信息
     * @param messageBody
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean saveWXRegisterObject(Map<String, Object> messageBody) {
        logger.info("微信注册信息====msg={}", messageBody);

        //判断map是否有数据
        if (null == messageBody || messageBody.size() <= 0) {
            logger.error("保存微信注册信息为空");
            return false;
        }

        CustomerUshopDO customer = JSON.toJavaObject((JSON) messageBody.get("customer"),CustomerUshopDO.class);
        CustomerWxinfoRelDO wxRel = JSON.toJavaObject((JSON) messageBody.get("wxRel"),CustomerWxinfoRelDO.class);
        logger.info("新增，微信注册信息，用户表参数信息 customer:{}",customer);
        logger.info("新增，微信注册信息，用户微信关联表参数信息 wxRel:{}",wxRel);

        //判断是否为空
        if (customer == null || wxRel == null) {
            logger.error("注册信息不存在");
            return true;
        }

        //判断主键是否为空字符串
        if (StringUtils.isEmpty(customer.getCustomerId())){
            logger.error("customerId 不能为空");
            return true;
        }

        //判断openid是否为空
        if (StringUtils.isEmpty(wxRel.getOpenId())){
            logger.error("customer消费者，微信注册信息保存 openId 不能为空");
            return true;
        }

        //没有redis信息-保存 有redis信息 返回true 为了防止重复提交
        String redisKey = RedisConstants.RDS_WX_OPENID+wxRel.getOpenId();
        if (redisUtils.isHasKey(redisKey)){
            logger.error("customer消费者，微信注册信息保存 openid 重复提交");
            return true;
        }

        boolean isTrue = redisUtils.setIfAbsent(redisKey,wxRel.getOpenId(),RedisConstants.RDS_WX_EXP);
        //redis  保存不成功  重新消费
        if (!isTrue){
            logger.error("customer消费者，微信注册信息保存 openid保存redis有误");
            return false;
        }

        //执行保存方法
        try {
            customerUshopDao.save(customer);
            customerWxinfoRelDao.save(wxRel);
        } catch (DuplicateKeyException d) {
            logger.info("提示信息：{}，customerId：{}","微信注册信息，主键冲突,当前数据已经保存多次",customer.getCustomerId());
            return true;
        } catch (Exception e) {
            logger.info("customer：{}，wxRel：{}，错误提示：{}",customer,wxRel,"微信注册信息，保存数据其他异常");
            return true;
        }

        return true;
    }
}
